// package语句：声明当前类所在的包路径
// com.itheima.extends4feature 表示当前类在extends4feature包中
package com.itheima.extends4feature;

// public class Test2：定义一个公共的类Test2
// public表示这个类可以被任何地方的代码访问
public class Test2 {
    // public static void main(String[] args)：程序的入口方法
    // 这是Java程序执行的起点
    public static void main(String[] args) {
        // 这行注释说明了这段代码的目的：演示继承后的就近原则
        // 目标2：继承后子类的访问特点：就近原则。
        
        // 创建Zi类的对象，变量名是zi
        // Zi是子类，继承自Fu父类
        Zi zi = new Zi();
        
        // 调用zi对象的show方法
        // 这个方法将演示变量和方法的就近访问原则
        zi.show();
    }
}

// class Fu：定义一个类Fu，作为父类
// 由于没有使用extends关键字，Fu类默认继承Object类
class Fu{
    // 定义Fu类的成员变量name，初始值为"fu的name"
    // 这是父类的成员变量
    String name = "fu的name";
    
    // 定义Fu类的run方法
    // 这是父类的成员方法
    public void run(){
        // 输出父类run方法被调用的信息
        System.out.println("fu类的run方法");
    }
}

// class Zi extends Fu：定义一个类Zi，它继承自Fu类
// Zi是子类，Fu是父类
class Zi extends Fu{
    // 定义Zi类的成员变量name，初始值为"zi的name"
    // 这个变量与父类的name变量同名，会覆盖父类的变量
    String name = "zi的name";
    
    // 定义Zi类的show方法
    // 这个方法用于演示变量和方法的就近访问原则
    public void show() {
        // 在方法内部定义局部变量name，初始值为"show的name"
        // 这是方法内部的局部变量
        String name = "show的name";
        
        // 直接访问name变量
        // 根据就近原则，会访问最近作用域内的name，即方法内的局部变量
        System.out.println(name); // 输出：show的name
        
        // 使用this关键字访问name变量
        // this表示当前对象，这里访问的是当前对象(Zi类)的成员变量
        System.out.println(this.name); // 输出：zi的name
        
        // 使用super关键字访问name变量
        // super表示父类对象，这里访问的是父类(Fu类)的成员变量
        System.out.println(super.name); // 输出：fu的name

        // 直接调用run方法
        // 根据就近原则，会调用当前类中定义的run方法，如果当前类没有才会调用父类的
        run(); // 输出：zi类的run方法
        
        // 使用super关键字调用run方法
        // 明确指定调用父类的run方法，而不是当前类的
        super.run(); // 输出：fu类的run方法
    }

    // 定义Zi类的run方法
    // 这个方法与父类的run方法同名，会重写(override)父类的run方法
    public void run(){
        // 输出子类run方法被调用的信息
        System.out.println("zi类的run方法");
    }
}
